package main

import (
	"fmt"
	"math/rand"
)

// 声明一个接口类型的方法时使用单向channel类型
type Constraint interface {
	SendInt(ch chan<- int)
}

// 约束此方法传入的参数只能是channel
func SendInt(ch chan<- int) {
	ch <- rand.Intn(1000)
}

// 在函数声明的结果列表中也使用单向channel
// 返回一个<-chan int类型的channel，约束得到该channel的程序只能从channel中接收元素值
func getIntChan() <-chan int {
	num := 5
	ch := make(chan int, num)
	for i := 0; i < num; i++ {
		ch <- i
	}
	close(ch)
	return ch
}

type GetIntChan func() <-chan int

func main() {
	intChan1 := make(chan int, 3)
	SendInt(intChan1)

	intChan2 := getIntChan()
	for elem := range intChan2 {
		fmt.Printf("intChan2中的元素值: %v\n", elem)
	}

	_ = GetIntChan(getIntChan)
}

/*
intChan2中的元素值: 0
intChan2中的元素值: 1
intChan2中的元素值: 2
intChan2中的元素值: 3
intChan2中的元素值: 4
*/
